Форум dkLab и Denwer
Здесь общаются Web-разработчики.
Генеральный спонсор:
Хостинг «Джино»

Хранение логики предикатов в БД (Логик)
Author Message
Логик
Guest





Карма: 388
   поощрить/наказать


PostPosted: Thu Dec 15, 2005 4:58 am (написано за 1 минуту 35 секунд)
   Post subject: Хранение логики предикатов в БД
Reply with quote

Не натолкнет ли кто на мысль как сохранить в БД следующее выражение:

(^A || (B & ^C)) & (D || F)

думаю уровень вложенности не более двух...

а потом главное проверить как то...

т.е. грубо говоря в БД будет несколько таких выражений, и есть набор значений:
A = true
B = false
C = true
...

и надо найти какое подходит...

все дело в хранении, а не в проверке.

Поясняю почему:
мне не надо чтобы такую чушь видел пользователь составляющий выражения, он должен видеть конструктор какой то. А я должен это хранить, желательно НЕ строкой как есть...


Есть набор ситуаций:
Ситуация 1
Ситуация 2

Есть набор правил, при который выполняется ситуация:

Если (П1=1 и П2=13) или П3=234 - тогда ситуация 1 выполняется
Если (П1=2 или П2=15) и П3!=123 - тогда ситуация 2 выполняется
где П1, Пn - параметры и через равно их значения...

Так же есть набор справочников:
П1
П2
П3

Есть значения элементов справочника:
П1: 1,2,3,4,5,6,7,8
П2: 11,12,13,14,15,16,17,18
П3: 21,22,23,42,25,26,27,28

Теперь мне надо составить набор правил для ситуации 4 например.
Она выполняется когда срабатывает условие:
(П1=1 и не(П3!=21 или П2=1)) или П3=234


А уже потом вводя значения параметров П1, П2, П3, П4 необходимо определить к какой ситуации это относится.

Если не делать сложных правил для определения правил, тогда все просто, когда ситуация срабатывает при
П1=1 и П2=12 и П3=42
это все элементарно как "два в десятой".

Думается насчет хранения такая мысль:
Использовать для вложенных правил NestedSets
Узлы дерева имеют следующие характеристики:

* cid
* cleft
* cright
* clevel
* c_is_group - флаг является ли групповым
* c_operation - знак перед выражением (AND/OR), означает то, какой оператор соединяет его с предыдущим в этой подветке, если элемент первый, тогда ставится по умолчанию оператор OR и он будет присоединяться к нулю, так как 0 || некоторое число == это же самое некоторое число
* c_sign - флаг: отрицание элемента или группы
* cvalue_id - идентификатор значения элемента
* ccache - кэшированное выражение


итого
(П1=1 и не(П3!=21 или П2=1)) или П3=234
разбивается на несколько элементов


1) - (П1=1 и не(П3!=21 или П2=1))2) -- П1=13) -- не(П3!=21 или П2=1)4) --- П3!=215) --- П2=16) - П3=234
Для первого:
cid = 1
cleft = ...
cright = ...
clevel = ...
c_is_group = true
c_operation = OR
c_sign = 0
cvalue_id = NULL, так как группа
ccache = (П1=1 и не(П3!=21 или П2=1))

для второго:
cid = 2
cleft = ...
cright = ...
clevel = ...
c_is_group = false
c_operation = OR
c_sign = 0
cvalue_id = 1
ccache = (П1=1)

Вообще есть мнения?

Сразу оговорюсь, что топик создан не только на вашем форуме, так как вопрос в принципе показался мне не тривиальным...
еще тут: www.sql.ru/forum/actualthread.aspx?tid=244417
Back to top
Display posts from previous:   
Post new topic   Reply to topic All times are GMT + 3 Hours
Page 1 of 1    Email to a Friend.
You cannot post new topics in this forum. You cannot reply to topics in this forum. You cannot edit your posts in this forum. You cannot delete your posts in this forum. You cannot vote in polls in this forum. You cannot attach files in this forum. You can download files in this forum.
XML